package lucava.util;

/**
 * Structure d'un fichier généré.
 */
public class FileBuffer {

	/**
	 * Flux d'écriture du contenu du fichier généré.
	 */
	protected final StringBuffer mBuffer;

	/**
	 * Nom du fichier généré.
	 */
	private final String mFileName;

	/**
	 * Booléen indiquant si le retour console est actif lors de l'écriture.
	 */
	protected final boolean mConsoleIsActive;

	/**
	 * Valeur courante du décalage de début de ligne.
	 */
	protected int mCurrentTabValue = 0;

	/**
	 * Constructeur.
	 * 
	 * @param aFilename
	 *            , Nom du fichier généré.
	 */
	public FileBuffer(String aFilename) {
		this(aFilename, true);
	}

	/**
	 * Constructeur.
	 * 
	 * @param aFilename
	 *            , Nom du fichier généré.
	 * @param aConsoleActivity
	 *            , Activité de la console lors de l'écriture.
	 */
	public FileBuffer(String aFilename, boolean aConsoleActivity) {
		this.mBuffer = new StringBuffer();
		this.mConsoleIsActive = aConsoleActivity;
		this.mFileName = aFilename;

		if (this.mConsoleIsActive) {
			System.out.println("Ouverture du fichier '" + aFilename + "'");
		}
	}

	/**
	 * Écrit dans le fichier.
	 * 
	 * @param aString
	 *            , Chaine à écrire.
	 */
	public void print(String aString) {

		// Ecriture dans la console
		if (this.mConsoleIsActive) {
			System.out.print(aString);
		}

		// Ecriture dans le buffer
		this.mBuffer.append(aString);
	}

	/**
	 * Écrit dans le fichier en ajoutant le décalage courant.
	 * 
	 * @param aString
	 *            , Chaine à écrire.
	 */
	public void printWithTab(String aString) {
		this.tab();
		this.print(aString);
	}

	/**
	 * Ajout un saut de ligne au fichier.
	 */
	public void printNewLine() {
		this.print(System.getProperty("line.separator"));
	}

	/**
	 * Écrit dans le fichier puis passe à la ligne.
	 * 
	 * @param aString
	 *            , Chaine à écrire.
	 */
	public void printLn(String aString) {
		this.print(aString);
		this.printNewLine();
	}

	/**
	 * Écrit avec un décalage dans le fichier puis passe à la ligne.
	 * 
	 * @param aString
	 *            , Chaine à écrire.
	 */
	public void printLnWithTab(String aString) {
		this.printWithTab(aString);
		this.printNewLine();
	}

	/**
	 * Ajoute un décalage dans le fichier.
	 */
	public void tab() {
		for (int i = 0; i < this.mCurrentTabValue; i++) {
			this.print("\t");
		}
	}

	/**
	 * Retourne le contenu du fichier généré.
	 */
	public String getContent() {
		return this.mBuffer.toString();
	}

	/**
	 * Augmente la valeur du décalage courant.
	 */
	public void increaseTab() {
		this.mCurrentTabValue++;
	}

	/**
	 * Diminue la valeur du décalage courant.
	 */
	public void decreaseTab() {
		this.mCurrentTabValue--;
	}

	/**
	 * Retourne le nom du fichier généré.
	 */
	public String getFileName() {
		return mFileName;
	}
}
